객체 하나를 생성하는데, 복수의 빌더가 사용되는 경우
class Person{
std::string street_address, post_code, city;
std::string company_name, position;
int annual_income=0;
Person() {}
};
위의 클래스에 대하여 4가지 빌더를 정의
PersonBuilderBase와 이를 상속하는
PersonBuilder, PersonAddressBuilder, PersonJobBuilder 클래스
class PersonBuilderBase{
protected:
Person& person;
explicit PersonBuilderBase(Person& person): person(person) {}
public:
operator Person(){
return std::move(person);
}
PersonAddressBuilder lives() const;
PersonJobBuilder works() const;
};
class PersonBuilder: public PersonBuilderBase{
Person p;
public:
PersonBuilder(): PersonBuilderBase{p} {}
};
class PersonAddressBuilder: public PersonBuilderBase{
typedef PersonAddressBuilder self;
public:
explicit PersonAddressBuilder(Person& person): PersonBuilderBase{person} {}
self& at(std::string street_address){
person.street_address=street_address;
return *this;
}
self& with_postcode(std::string post_code){
}
self& in(std::string city){
}
};
세 개의 Builder 클래스에서 Person private 멤버에 접근할 수 있도록 friend로 선언해야 한다.
Person p=Person::build()
.lives().at("123 London Road")
.with_postcode("SW1 1GB")
.in("London")
.works().at("PragmaSoft")
.as_a("Consultant")
.earning(10e6);